This notebook uses cython, which requires a C compiler. Linux comes with a compiler. Install xcode for OSX and Visual Studio for windows.
In [1]:
%load_ext cython
In [2]:
import array
a = array.array('l',range(100))
s = 0
Sum up an array of numbers using python
In [3]:
def python_sum(a):
global s
s = 0
for i in range(len(a)):
for j in range(10000):
s = s + a[i]
return s
In [4]:
%timeit python_sum(a)
Use cython, without changing the code
In [5]:
%%cython --annotate
def cython_sum1(a):
global s
s = 0
for i in range(len(a)):
for j in range(10000):
s = s + a[i]
return s
Out[5]:
In [6]:
print('python sum: ',python_sum(a))
print('cython sum1: ',cython_sum1(a))
print('python sum')
%timeit python_sum(a)
print('cython sum1')
%timeit cython_sum1(a)
Does making s a local variable help?
In [7]:
%%cython --annotate
def cython_sum2(a):
s = 0
for i in range(len(a)):
for j in range(10000):
s = s + a[i]
return s
Out[7]:
In [8]:
print('python sum: ',python_sum(a))
print('cython sum1: ',cython_sum1(a))
print('cython sum2: ',cython_sum2(a))
print('python sum')
%timeit python_sum(a)
print('cython sum1')
%timeit cython_sum1(a)
print('cython sum2')
%timeit cython_sum2(a)
In [9]:
%%cython --annotate
from cpython cimport array
def cython_sum3(a):
cdef long s = 0
cdef array.array ta = a
cdef long * ap = ta.data.as_longs
for i in range(len(ta)):
for j in range(10000):
s = s + ap[i]
return s
Out[9]:
In [10]:
print('python sum: ',python_sum(a))
print('cython sum1: ',cython_sum1(a))
print('cython sum2: ',cython_sum2(a))
print('cython sum3: ',cython_sum3(a))
print('python sum')
%timeit python_sum(a)
print('cython sum1')
%timeit cython_sum1(a)
print('cython sum2')
%timeit cython_sum2(a)
print('cython sum3')
%timeit cython_sum3(a)
In [11]:
from numba import jit
@jit
def numba_sum(a):
s = 0
for i in range(len(a)):
for j in range(10000):
s = s + a[i]
return s
In [13]:
print('python sum: ',python_sum(a))
print('cython sum1: ',cython_sum1(a))
print('cython sum2: ',cython_sum2(a))
print('cython sum3: ',cython_sum3(a))
print('numba sum: ', numba_sum(a))
print('python sum')
%timeit python_sum(a)
print('cython sum1')
%timeit cython_sum1(a)
print('cython sum2')
%timeit cython_sum2(a)
print('cython sum3')
%timeit cython_sum3(a)
print('numba sum')
%timeit numba_sum(a)